Tritask dup属性コード残骸
消す前でいいか
Gitにも残るけど、すぐ見れるようにこっちにも退避しておく
code:testcode.py
def test_duplicate(self):
lines = []
lines.append(self.add_task_with_start_end('昨日以前のタスク されない dup:1', '08:01', '08:03'))
lines.append(self.add_task('明日以降のタスク されない dup:1'))
lines.append(self.add_task('されない dup:1'))
lines.append(self.add_task_with_start_end('されない dup:1', '08:01'))
lines.append(self.add_task_with_start_end('される dup:1', '08:01', '08:03'))
# 昨日以前と明日以降をつくる
self._args.y = 0
self._args.day = -1
self._args.walk = True
tritask.proceed_lines_and_is_save_required(self._args, lines)
self._clear_args()
self._args.y = 1
self._args.day = 1
self._args.walk = True
tritask.proceed_lines_and_is_save_required(self._args, lines)
# 本題、ソートすると duplicate が適用される
self._clear_args()
self._args.sort = True
tritask.proceed_lines_and_is_save_required(self._args, lines)
actual_lines = lines
expect_lines = []
expect_lines.append('{} 2020/04/01 Wed {} {} される dup:1'.format(
TD,
'08:01',
'08:03',
))
expect_lines.append('{} 2020/04/01 Wed {} {} されない dup:1'.format(
TT,
emptytime,
emptytime,
))
# dup された分が増える
expect_lines.append('{} 2020/04/01 Wed {} {} される dup:1'.format(
TT,
emptytime,
emptytime,
))
expect_lines.append('{} 2020/04/01 Wed {} {} されない dup:1'.format(
TS,
'08:01',
emptytime,
))
expect_lines.append('{} 2020/04/02 Thu {} {} 明日以降のタスク されない dup:1'.format(
TOM,
emptytime,
emptytime,
))
expect_lines.append('{} 2020/03/31 Tue {} {} 昨日以前のタスク されない dup:1'.format(
YE,
'08:01',
'08:03',
))
self.assertEqual(expect_lines, actual_lines)
def test_duplicate_for_skiptotomorrow(self):
lines = []
lines.append(self.add_task_with_start_end('される dup:1', '08:01', '08:03'))
self._args.sort = True
tritask.proceed_lines_and_is_save_required(self._args, lines)
actual_lines = lines
expect_lines = []
expect_lines.append('{} 2020/04/01 Wed {} {} される dup:1'.format(
TD,
'08:01',
'08:03',
))
expect_lines.append('{} 2020/04/01 Wed {} {} される dup:1'.format(
TT,
emptytime,
emptytime,
))
self.assertEqual(expect_lines, actual_lines)
# 本題
# duplicated task を today から tomorrow に飛ばすと、
# スキップしたとみなして duplicate はしない。
self._clear_args()
self._args.y = 1
self._args.day = 1
self._args.walk = True
tritask.proceed_lines_and_is_save_required(self._args, lines)
self._clear_args()
self._args.sort = True
tritask.proceed_lines_and_is_save_required(self._args, lines)
actual_lines = lines
expect_lines = []
expect_lines.append('{} 2020/04/01 Wed {} {} される dup:1'.format(
TD,
'08:01',
'08:03',
))
# この duplicated task はつくられない
# TT,
# emptytime,
# emptytime,
expect_lines.append('{} 2020/04/02 Thu {} {} される dup:1'.format(
TOM,
emptytime,
emptytime,
))
self.assertEqual(expect_lines, actual_lines)
code:impl.py
class Task:
……
def is_duplicate_target(self):
# 明日以降や過去に dup task があると常に増える挙動になるのでガードする。
if not self.is_today():
return False
s, e = len(self._starttime.strip()), len(self._endtime.strip())
if s==0:
return False
if e==0:
return False
return True
code:impl.py
def apply_duplicates(lines):
duplicatee_lines = []
# ややこしいのでまとめる。
# ---
# まずは done task
# - O doneになった「task dup:1」がtodayにある
# - X doneになった「task dup:1」がtomorrowにある / 明日はdoneにできないので無効
# - X doneになった「task dup:1」がyesterdayにある / 無限に duplicate するので無効
#
# 問題は done した後に duplicate された task dup:1 の日付
# - O todayである → task dup:1 はまだ行うかもしれない
# - X yesterdayである → 昨日以前のtodo taskはありえないので無効
# - O tomorrowである → ★1
#
# ★1をもう少し賢くしたい
# - 何もしないと duplicate されたままになる
# - が、tomorrowにあるということは「明日でいいや」と先送りにしたことを意味する
# - 先送りにしたのに、today に duplicate されるというのはうっとうしい
# 先送りした場合は、duplicate をやめてほしい。
# ---
#
# 本題
# 「先送りした場合に duplicate しない」を実装するには?
# - 1: 「duplicate された行」を先につくる
# - 2: 1 の有無を lines 全体に渡って調べる
# この状況次第で、1 を採用(追加)するか見送る(追加しない)か決める
# このあたりの判定は、上記でまとめた分岐に基づく
#
# Ans: 性能のため.
# Task インスタンス化すると性能的に厳しい……
# テストコードはあるので壊れてもすぐ気付ける……
#
# ガチるなら「completeしないparse」みたいなI/F用意する、とかかしら?
for i, line in enumerate(lines):
if line.find('dup:')==-1:
continue
task = Task(line)
if not task.is_duplicate_target():
continue
# duplicate されたタスクはあとで着手するので today todo にする
task.to_todaytodo()
duplicatee_line = str(task)
duplicatee_lines.append(duplicatee_line)
for duplicatee_line in duplicatee_lines:
already_exists = False
description_of_task_duplicatee = Task(duplicatee_line).description
for line in lines:
description_of_matchee_task = line29: sortmark_of_matchee_task = line0:1 is_same_task = description_of_task_duplicatee==description_of_matchee_task
if not is_same_task:
continue
already_added_to_today = sortmark_of_matchee_task==Task.TT
if already_added_to_today:
already_exists = True
break
is_skipped_to_tomorrow = sortmark_of_matchee_task==Task.TOM
if is_skipped_to_tomorrow:
already_exists = True
break
if already_exists:
continue
lines.append(duplicatee_line)
code:py
if args.sort:
apply_holding(lines)
apply_skipping(lines)
apply_completion(lines)
apply_duplicates(lines) # ★ここが要らない
apply_cloning(lines)
apply_old_clonee_clearning(lines)
lines.sort()
return True